package com.zk.curator.atomicinteger;

import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.atomic.AtomicValue;
import org.apache.curator.framework.recipes.atomic.DistributedAtomicInteger;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.curator.retry.RetryNTimes;

/**
 * 分布式原子计数器，可以实现网站的访问数量
 * 
 * @author root
 *
 */
public class CuratorAtomicInteger {
	/**
	 * zookeeper地址
	 */
	static final String CONNECT_ADDR = "192.168.254.134:2181";
	/**
	 * session超时时间
	 */
	static final int SESSION_OUTTIME = 5000;// ms

	public static void main(String[] args) throws Exception {

		/**
		 * 1 重试策略：初试时间为1s 重试10次
		 */
		RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 10);
		/**
		 * 2 通过工厂创建连接
		 */
		CuratorFramework cf = CuratorFrameworkFactory.builder().connectString(CONNECT_ADDR)
				.sessionTimeoutMs(SESSION_OUTTIME).retryPolicy(retryPolicy).build();
		/**
		 * 3 开启连接
		 */
		cf.start();
		/**
		 * cf.delete().forPath("/super");
		 */

		/**
		 * 4 使用DistributedAtomicInteger
		 */
		DistributedAtomicInteger atomicIntger = new DistributedAtomicInteger(cf, "/super", new RetryNTimes(3, 1000));
		/**
		 * 强制性请0，设值为0
		 */
		// atomicIntger.forceSet(0);
		AtomicValue<Integer> value = atomicIntger.add(1);
		System.out.println(value.succeeded());
		/**
		 * 最新值
		 */
		System.out.println(value.postValue());
		/**
		 * 原始值
		 */
		System.out.println(value.preValue());
		/**
		 * cf关闭
		 */
		cf.close();
	}
}
